import java.util.ArrayDeque;
import java.util.Queue;

public class ImplementStackByQueue {
    /*
    * 用队列实现栈
    * 请你仅使用两个队列实现一个后入先出（LIFO）的栈，并支持普通栈的全部四种操作（push、top、pop 和 empty）。
    * 实现 MyStack 类：
    * void push(int x) 将元素 x 压入栈顶。
    * int pop() 移除并返回栈顶元素。
    * int top() 返回栈顶元素。
    * boolean empty() 如果栈是空的，返回 true ；否则，返回 false 。
    *
    * 注意：
    * 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
    * 你所使用的语言也许不支持队列。
    * 你可以使用 list （列表）或者 deque（双端队列）来模拟一个队列 , 只要是标准的队列操作即可。
    *
    * 1 <= x <= 9
    * 最多调用100 次 push、pop、top 和 empty
    * 每次调用 pop 和 top 都保证栈不为空
    * */
    public static void main(String[] args){

    }

}

// 可以只使用一个队列，将除最后一个元素外的其他元素弹出再加到队尾，这样就可以得到最后加入的元素
class MyStack {

    Queue<Integer> elementQueue;
    Queue<Integer> queueHelper;

    public MyStack() {
        elementQueue = new ArrayDeque();
        queueHelper = new ArrayDeque();
    }

    public void push(int x) {
        elementQueue.add(x);
    }

    public int pop() {
        pourKeepOne();
        Integer res = elementQueue.poll();
        rePour();
        return res;
    }

    public int top() {
        pourKeepOne();
        Integer res = elementQueue.peek();
        rePour();
        return res;
    }

    public boolean empty() {
        return elementQueue.isEmpty() && queueHelper.isEmpty();
    }

    private void pourKeepOne(){
        while (elementQueue.size() > 1){
            queueHelper.add(elementQueue.poll());
        }
    }
    private void rePour(){
        while (!elementQueue.isEmpty()){
            queueHelper.add(elementQueue.poll());
        }
        while (!queueHelper.isEmpty()){
            elementQueue.add(queueHelper.poll());
        }
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */


